home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tapest / tapest.lzh / COLOR.C next >
Text File  |  1991-01-29  |  2KB  |  92 lines

  1. /*
  2.     color support routines
  3. */
  4. #define COLOR
  5. #include <egb.h>
  6. #include "color.h" 
  7.  
  8. extern char gwork[] ;
  9.  
  10. struct {
  11.     long pnum ;
  12.     struct {
  13.         long pcode ;
  14.         PCOL col ;
  15.     } pal[256] ;
  16. } ptable ;
  17.  
  18. long HSVtoRGB( h, s, v ) /* range h E (-360,720)  s,v E (0,1) */
  19. float h,s,v ;
  20. {
  21.     double h1,f,p,q,t ;
  22.     int h2 ;
  23.     PCOL rgb ;
  24.  
  25.     if( h > 360) h -= 360 ;
  26.     if( h < 0 ) h += 360 ;
  27.     h1 = h / 60. ;
  28.     h2 = h1 ;
  29.     f = h1 - h2 ;
  30.     p = s * v ;
  31.     q = p * f ;
  32.     p = v - p ;
  33.     t = p + q ;
  34.     q = v - q ;
  35.     rgb.col8.i = 0 ;
  36.     switch( h2 ) {
  37.     case 0:
  38.         rgb.col8.r = v * 255 ;
  39.         rgb.col8.g = t * 255 ;
  40.         rgb.col8.b = p * 255 ;
  41.         break ;
  42.     case 1:
  43.         rgb.col8.r = q * 255 ;
  44.         rgb.col8.g = v * 255 ;
  45.         rgb.col8.b = p * 255 ;
  46.         break ;
  47.     case 2:
  48.         rgb.col8.r = p * 255 ;
  49.         rgb.col8.g = v * 255 ;
  50.         rgb.col8.b = t * 255 ;
  51.         break ;
  52.     case 3:
  53.         rgb.col8.r = p * 255 ;
  54.         rgb.col8.g = q * 255 ;
  55.         rgb.col8.b = v * 255 ;
  56.         break ;
  57.     case 4:
  58.         rgb.col8.r = t * 255 ;
  59.         rgb.col8.g = p * 255 ;
  60.         rgb.col8.b = v * 255 ;
  61.         break ;
  62.     case 5:
  63.         rgb.col8.r = v * 255 ;
  64.         rgb.col8.g = p * 255 ;
  65.         rgb.col8.b = q * 255 ;
  66.         break ;
  67.     }
  68.     return rgb.col24 ;
  69. }  
  70.  
  71. void palette( ss, es, sh, eh, s, ds, v, dv )
  72. int ss, es ;
  73. int sh, eh ;
  74. float s, ds ;
  75. float v, dv ;
  76. {
  77.     float h,dh ;
  78.     int i,m ;
  79.  
  80.     if( eh < sh ) eh += 360 ;
  81.     dh = (eh - sh)/(es - ss + 1.) ;
  82.     h = sh ;
  83.     ptable.pnum = es - ss + 1 ;
  84.     for( i = ss ; i <= es ; i++, h += dh ){
  85.         ptable.pal[i].pcode = i ;
  86.         m = (i & 1) ;
  87.         ptable.pal[i].col.col24 = HSVtoRGB( h, s + m*ds, v + m*dv ) ;
  88.     }
  89.     EGB_palette( gwork, 1, (char *)&ptable ) ;
  90. }
  91.  
  92.